package register;

import Config.RegistryConfig;
import model.ServiceInfo;

import java.util.List;

/**
 * 注册中心接口 （可用于注册中心的不同实现）
 */
public interface Registry {
    /**
     * 用于注册中心初始化（连接注册中心，服务消费者和服务提供者都要初始化，连接注册中心）
     * @param registryConfig
     */
    void init(RegistryConfig registryConfig);

    /**
     * 将某个服务的元信息注册到注册中心（用于服务提供者）
     * @param serviceInfo
     * @throws Exception
     */
    void register(ServiceInfo serviceInfo) throws Exception;

    /**
     * 将某服务撤销（用于服务提供者）
     * @param serviceInfo
     */
    void unRegister(ServiceInfo serviceInfo);

    /**
     * 服务发现（用于服务消费者）
     * @param serviceKey
     * @return
     */
    List<ServiceInfo> serviceDiscovery(String serviceKey);

    /**
     * 注销注册中心
     */
    void destory();

    /**
     * 心跳检测
     */
    void heartBeat();

    /**
     * 监听注册中心key的变化(解决缓存更新问题，当key变化时（删除），则更新服务本地缓存)
     */
    void watchKey(String serviceNodeKey);
}
